#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<unistd.h>
#include<conio.h>
#define max 10	//��ʼ�������10 (0-9)
#define addnum 5 //����ÿ��Ϊ5 
typedef struct {
	char name[5];
	int age;
	char gen[6]; 
}data;
typedef struct list{
	data *da;
	int size;
	int cap;
}list;
list *creatlist(){
	list *p=(list*)malloc(sizeof(list)*max);
	p->da=(data*)malloc(sizeof(data)*max);
	p->size=0;//��ʼΪ0 
	p->cap=max;//��ʼ����Ϊ10 
	return p;
}
void pushin(list *p,char name[],int age,char gen[]){
	
	if((p->size)>=(p->cap)){
		printf("�ڴ���������������");
		return ;
	}
	strcpy(p->da[p->size].name,name);
	p->da[p->size].age=age;
	strcpy(p->da[p->size].gen,gen);
	p->size++;
}
int extend(list *p){
	list *newp=(list *)malloc(sizeof(list)*(p->cap+addnum));
	p->cap+=addnum;
	for(int i=0;i<p->size;i++)
		newp->da[i]=p->da[i];
	free(p->da);
	p->da=newp->da;
	return 1;
}
void del(list* p,char tar[]){
	for(int i=0;i<p->size;i++)
		if(!strcmp(p->da[i].name,tar)){
			for(;i<p->size-1;i++)
				p->da[i]=p->da[i+1];
			p->size--;
			return;
		}	
	printf("�Ҳ���Ŀ��\n");
}
void search(list *p,char tar[]){
	printf("����\t����\t�Ա�\n");
	for(int i=0;i<p->size;i++){
		printf("%s\t%d%s\n",p->da[i].name,p->da[i].age,p->da[i].gen);
		if(!strcmp(p->da[i].name,tar)){
			printf("\nĿ�꣺%s\t%d\t%s\n",p->da[i].name,p->da[i].age,p->da[i].gen);
			return;
		}
	}
	printf("�Ҳ���Ŀ��\n");
}
void insert(list *p,int pos,char name[],int age,char gen[]){

	if (p->size >= p->cap) {
	        printf("���ݲ��㣬��������\n");
	        return;
	    }
	if (pos < 0 || pos > p->size ) {
	    printf("����λ�ô���\n");
	    return;
	    }
	for(int i=p->size-1;i>pos;i--)
		p->da[i]=p->da[i];
	for(int i=0;name[i]!='\0';i++)
		(*p).da[pos-1].name[i]=name[i];
	p->da[pos].age=age;
	for(int i=0;gen[i]!='\0';i++)
		(*p).da[pos-1].gen[i]=gen[i];
	p->size++;
	printf("done\n");
}
void processbar(){
	int i=0;
	char prbar[max*max];
	memset(prbar,0,sizeof(prbar));
	const char *arr="|\\-/";
	while(i<=100){  
	    printf("[%-100s][%3d%%] %c\r",prbar,i,arr[i%4]);                                                                                                           
	    fflush(stdout);                                                                                                                                                                                                                                                       
	    prbar[i]='#';                                                                                    
	    i++;                                                                                                                                
	    usleep(500);                                                                                                                      
	  }                                                                                                                                  
	  printf("\n");                                                                                                                                                                                                                                                      
}
int main(){
	char name[5],gen[6],tar[5],ch;
	int age,set,pos;
	list *p=creatlist();
	printf("�����У�\n");
	processbar(); 
	while(1){
		system("cls");
		printf("��ǰ�Ǽ�����%d����ǰ�ڴ�%d\n���빦��:\n1.add 2.extend 3.delete 4.search 5.insert 6.exit\n",p->size,p->cap-1);
		scanf("%d",&set);
		switch(set){
			case 1:
				printf("���������� ���� �Ա�"); 
				scanf("%s %d %s",name,&age,gen);
				pushin(p,name,age,gen);
				processbar();
				printf("done �����������\n");
				ch=getch();
				if(ch)
					break;
			case 2:
				printf("������");
				processbar();
				if(extend(p))
					printf("done\n��ǰ������%d ��ǰ�ڴ棺%d\n",p->size,p->cap-1);
				printf("done �����������\n");
				ch=getch();
				if(ch)
					break;
			case 3:
				printf("������ɾ��Ŀ�꣺");
				scanf("%s",tar);
				processbar();
				del(p,tar);
				printf("done �����������\n");
				ch=getch();
				if(ch)
					break;
			case 4:
				printf("���������Ŀ��������"); 
				scanf("%s",tar);
				processbar();
				search(p,tar);
				printf("done �����������\n");
				ch=getch();
				if(ch)
					break;
			case 5:
				printf("���������λ�ã�(0-%d)\n",p->size);
				scanf("%d",&pos);
				printf("�������������� ���� �Ա�");
				scanf("%s %d %s",name,&age,gen);
				processbar();
				insert(p,pos,name,age,gen);
				printf("done �����������\n");
				ch=getch();
				if(ch)
					break;
			case 6:
				exit(0);
		}
	} 
	free(p);
	return 0;
}
